<!DOCTYPE html>
<html lang="zh">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
        <title>推荐系统综述 | Dirac Lee</title><meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="robots" content="noodp" />
<meta name="Description" content="Dirac Lee 的博客"><link rel="prev" href="https://diraclee.gitee.io/2020/11/svm/" /><link rel="next" href="https://diraclee.gitee.io/2020/12/%E7%8E%B0%E4%BB%A3%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9B%BE%E5%BD%A2%E5%AD%A6%E5%85%A5%E9%97%A8/" /><link rel="canonical" href="https://diraclee.gitee.io/2020/12/%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9F%E7%BB%BC%E8%BF%B0/" />
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico" />
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="manifest" href="/site.webmanifest">
<link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="theme-color" content="#ffffff"><meta property="og:title" content="推荐系统综述" />
<meta property="og:description" content="" />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://diraclee.gitee.io/2020/12/%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9F%E7%BB%BC%E8%BF%B0/" />
<meta property="article:published_time" content="2020-12-03T00:00:00+00:00" />
<meta property="article:modified_time" content="2020-12-04T00:00:00+00:00" />
<script type="application/ld+json">
    {
        "@context": "http://schema.org",
        "@type": "BlogPosting",
        "headline": "推荐系统综述",
        "mainEntityOfPage": {
            "@type": "WebPage",
            "@id": "https:\/\/diraclee.gitee.io\/2020\/12\/%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9F%E7%BB%BC%E8%BF%B0\/"
        },"image": {
                "@type": "ImageObject",
                "url": "https:\/\/diraclee.gitee.io\/logo.png",
                "width":  800 ,
                "height":  600 
            },"genre": "posts","keywords": "推荐系统, 综述","wordcount":  4353 ,
        "url": "https:\/\/diraclee.gitee.io\/2020\/12\/%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9F%E7%BB%BC%E8%BF%B0\/","datePublished": "2020-12-03T00:00:00\x2b00:00","dateModified": "2020-12-04T00:00:00\x2b00:00","license": "This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.","publisher": {
                "@type": "Organization",
                "name": "xxxx",
                "logo": {
                "@type": "ImageObject",
                "url": "https:\/\/diraclee.gitee.io\/logo.png",
                "width":  127 ,
                "height":  40 
                }
            },"description": ""
    }
    </script><link rel="stylesheet" href="/css/style.min.css"><link rel="stylesheet" href="/css/lib/fontawesome-free/all.min.css"><link rel="stylesheet" href="/css/lib/animate/animate.min.css"></head>
    <body><script>
            window.isDark = (window.localStorage && window.localStorage.getItem('theme')) === 'dark';
            window.isDark && document.body.classList.add('dark-theme');
        </script><div class="wrapper"><nav class="navbar">
    <div class="navbar-container">
        <div class="navbar-header animated bounceIn">
            <a href="https://diraclee.gitee.io">Dirac Lee</a>
        </div>
        <div class="navbar-menu"><a class="menu-item" href="https://diraclee.gitee.io/posts" title="">文章</a><a class="menu-item" href="https://diraclee.gitee.io/tags" title="">标签</a><a class="menu-item" href="https://diraclee.gitee.io/categories" title="">分类</a><a class="menu-item" href="https://diraclee.gitee.io/about" title="">关于</a><a class="menu-item" href="https://diraclee.gitee.io" title="English"><i class="fas fa-language fa-fw"></i></a><a href="javascript:void(0);" class="theme-switch"><i class="fas fa-adjust fa-rotate-180 fa-fw" title="切换主题"></i></a>
        </div>
    </div>
</nav><nav class="navbar-mobile">
    <div class="navbar-container">
        <div class="navbar-header">
            <div class="navbar-header-title animated bounceIn">
                <a href="https://diraclee.gitee.io">Dirac Lee</a>
            </div>
            <div class="menu-toggle" id="menu-toggle">
                <span></span><span></span><span></span>
            </div>
        </div>
        <div class="navbar-menu" id="mobile-menu"><a class="menu-item" href="https://diraclee.gitee.io/posts" title="">文章</a><a class="menu-item" href="https://diraclee.gitee.io/tags" title="">标签</a><a class="menu-item" href="https://diraclee.gitee.io/categories" title="">分类</a><a class="menu-item" href="https://diraclee.gitee.io/about" title="">关于</a><a class="menu-item" href="https://diraclee.gitee.io" title="English"></a><a href="javascript:void(0);" class="theme-switch"><i class="fas fa-adjust fa-rotate-180 fa-fw" title="切换主题"></i></a>
        </div>
    </div>
</nav><main class="main">
                <div class="container"><article class="page"><h1 class="post-title animated flipInX">推荐系统综述</h1><div class="post-meta">
            <div class="post-meta-main"><a class="author" href="https://diraclee.gitee.io" rel="author" target="_blank">
                    <i class="fas fa-user-circle fa-fw"></i>Dirac Lee
                </a>&nbsp;<span class="post-category">收录于&nbsp;<i class="far fa-folder fa-fw"></i><a href="https://diraclee.gitee.io/categories/%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9F/">推荐系统</a>&nbsp;</span></div>
            <div class="post-meta-other"><i class="far fa-calendar-alt fa-fw"></i><time datetime=2020-12-03>2020-12-03</time>&nbsp;
                <i class="fas fa-pencil-alt fa-fw"></i>约 4353 字&nbsp;
                <i class="far fa-clock fa-fw"></i>预计阅读 9 分钟&nbsp;</div>
        </div><div class="post-content"><a class="post-dummy-target" id="引言"></a><h2>引言</h2>
<p>随着互联网的发展，信息过载问题日趋严重。在这样的背景下，如何让用户获得感兴趣的信息从而提高用户留存率与转化率，成为互联网公司重点关注的问题。</p>
<p>1992 年，在互联网还未兴起的时候，Xerox 公司的研究中心开发出了基于用户的协同过滤算法（User-CF）来向用户提供定制化的推荐列表<sup>[1]</sup>。它的动机在于找到与目标用户趣味相投的其他用户，然后将这些用户所青睐的商品推荐给目标用户。但随着用户量的增长，该算法逐渐无力支撑用户相似度矩阵的存储压力。</p>
<p>2003 年，亚马逊公司公开了他们基于商品的协同过滤算法（Item-CF）<sup>[2]</sup>。该算法的动机是，找到目标用户曾经给予好评的商品，将与这些商品相似的商品推荐给目标用户。论文发表后，针对协同过滤的研究不断升温，Item-CF 也成为业界主流的推荐模型。然而，协同过滤算法有一个致命问题，就是头部效应明显，即所有商品与热门商品的相似度都很高，与冷门商品的相似度都近似为 0，这不利于新商品的推出和用户新鲜感的维护。此外，由于大部分用户没有评价的习惯，导致共现矩阵非常稀疏，助长了头部效应的影响。</p>
<p>2006年，在 Netflix 举办的推荐算法竞赛中，矩阵分解算法（MF）<sup>[3]</sup> 脱颖而出，成为此后数年推荐系统领域的研究热点。MF 将用户对商品的评分看作是用户隐向量对商品隐向量的点积，从而将共现矩阵分解为用户矩阵与商品矩阵的乘积。这种做法大大降低了数据存储压力，同时隐向量提高了模型的泛化能力，一定程度上缓解了数据稀疏问题。</p>
<p>然而，以上算法都有一个局限性，就是不方便加入更多有利于解决任务的特征，例如用户信息、用户历史行为、商品特征等。而融合多个特征来进行兴趣排序的问题可以转化为点击率（CTR）预估问题，逻辑回归正适合解决此类问题。值得注意的是，由于任务目标是获得用户对商品的点击率，而标签是用户的历史点击，因此训练时需将其作为分类问题训练，即输出为离散值，部署时需要得到点击率，即输出倒数第二层的连续值。逻辑回归简单、直观、易用，但如果不对输入数据进行特征交叉，就有可能导致信息损失，难以保证预测准确率。早期通常使用 POLY2 模型进行暴力地二元特征组合，然后使用逻辑回归进行点击率预估。然而这种方法使得权重参数数量激增，极大地增加了训练的复杂度。此外，一些采用 one-hot 编码的特征本身就很稀疏，无选择地特征交叉会使特征向量更加稀疏，导致大部分权重在训练时难以收敛。</p>
<p>2010年，Rendle 提出了因子分解机（FM）模型<sup>[4]</sup>，有效解决了这些问题。因子分解机模型借鉴了矩阵分解算法，将 POLY2 模型中组合特征 $x_{i, j}$ 的权重参数 $w_{i,j}$ 分解为两个 $k$ 维隐向量的乘积 $h_i\cdot h_j$，大大降低了参数数量。同时，隐向量的引入也有效解决了数据稀疏性的问题。</p>
<p>2015年，特征域因子分解机（FFM）<sup>[5]</sup>在多项点击率预测大赛中夺魁，并之后在Criteo、美团等公司得到广泛应用。FFM 对 FM 的改进之处在于，它引入了特征域感知这一概念，使得模型的表达能力更强。</p>
<p>2012年，在 ImageNet 大赛中，Alex Krizhevsky 提出基于深度神经网络的 AlexNet<sup>[6]</sup> 大放异彩，推动了深度学习在各个领域的发展与应用。在推荐系统领域，对深度学习的应用也取得了一系列重大进展。</p>
<p>（待完成）</p>
<a class="post-dummy-target" id="浅层学习推荐系统"></a><h2>浅层学习推荐系统</h2>
<a class="post-dummy-target" id="基于用户的协同过滤算法user-cf"></a><h3>基于用户的协同过滤算法（User-CF）</h3>
<p>User-CF的动机很简单，就是认为相似的用户其喜欢的商品也相同。它将用户特征表示为该用户的评分记录构成的向量，然后计算各个用户之间的相似度，得到用户相似度矩阵。之后通过相似度矩阵找到与目标用户最相似的k个用户，综合这k个用户对商品的评分，从而预估目标用户对商品的接受程度。</p>
<a class="post-dummy-target" id="用户相似度计算"></a><h4>用户相似度计算</h4>
<p>用于计算用户相似度的方法通常有余弦相似度和皮尔逊相关系数。其中皮尔逊相关系数是对余弦相似度的修正，可以通过修正用户评分偏置和物品评分偏置两种方式来进行修正。用户相似度的具体计算公式如下。</p>
<p><strong>余弦相似度</strong>：
$$
sim(i, j) = \cos(R_i, R_j) = \frac { R_i \cdot R_j } { ||R_i|| \cdot ||R_j|| } = \frac { \sum_{p \in P}  R_{i, p}  R_{j, p}   } { \sqrt{ \sum_{p \in P}  R_{i, p} ^2  R_{j, p}  ^2  } }
$$
其中 $R_i$ 是用户 $i$ 对所有商品的评分构成的向量，即用户向量。</p>
<p><strong>修正用户评分偏置的皮尔逊相关系数</strong>：
$$
sim(i, j) = \frac { \sum_{p \in P} ( R_{i, p} - \bar R_{i} ) ( R_{j, p} - \bar R_{j} ) } { \sqrt{ \sum_{p \in P} ( R_{i, p} - \bar R_{i} )^2 ( R_{j, p} - \bar R_{j} )^2  } }
$$
其中 $R_{i, p}$ 表示用户 $i$ 对商品 $p$ 的评分，$\bar R_i$ 表示用户 $i$ 对所有商品的平均评分。由于每个人对评分值的概念不同，因此使用用户打出的评分值并不能完全反映该用户对商品的真实满意度。例如有的人认为7分是一个很高的分数，对于很满意的商品才会给出7分的评分；而有的人却认为7分只是一个及格分，只要没有太大的缺陷就可以给商品打7分。因此，将减去用户对所有商品的平均评分 之后得到的数值，更能反应该用户对其已购买商品的真实满意度。</p>
<p><strong>修正物品评分偏置的皮尔逊相关系数</strong>：
$$
sim(i, j) = \frac { \sum_{p \in P} ( R_{i, p} - \bar R_{p} ) ( R_{j, p} - \bar R_{p} ) } { \sqrt{ \sum_{p \in P} ( R_{i, p} - \bar R_{p} )^2 ( R_{j, p} - \bar R_{p} )^2  } }
$$
其中 $R_{i, p}$ 表示用户 $i$ 对商品 $p$ 的评分，$\bar R_p$ 表示所有用户对商品 $p$ 的平均评分。类似地，我们可以认为，减去所有用户对商品的平均评分 之后得到的数值，更能反应该商品的真实受欢迎度。</p>
<a class="post-dummy-target" id="预估目标用户接受程度"></a><h4>预估目标用户接受程度</h4>
<p>找到与目标用户最相似的k个用户后，可以使用这k个用户对商品评价的加权平均数来表征目标用户对该商品的接受程度，其中权重为用户相似度。
$$
R_{u, p} = \frac { \sum_{s \in S} (w_{u, s} R_{s, p} ) } { \sum_{s \in S} w_{u, s} }
$$
其中$R_{u, p}$ 表示目标用户 $u$ 对商品 $p$ 的接受程度，$w_{u, s}$ 表示目标用户 $u$ 与相似用户 $s$ 之间的相似度，$R_{s, p}$ 表示相似用户 $s$ 对商品 $p$ 的评分。由于用户相似度矩阵在一段时间内是静态的，上式分母是一个常量，因此也可以只保留分子项。</p>
<p>求得目标用户对他没有接触过的商品的接受程度之后，按照接受程度从高到低进行排序，就得到了推荐商品列表。</p>
<a class="post-dummy-target" id="适用性"></a><h4>适用性</h4>
<p>User-CF 根据用户相似度进行推荐，天然具有强社交属性，能够让用户快速得知与自己兴趣相似的人最近喜欢的是什么，因此适用于发现热点、追踪热点的场景。而新闻本身注重的就是及时性和热点性，因此User-CF在新闻推荐领域扮演着重要角色。</p>
<p>然而，由于User-CF需要存储用户相似度矩阵，因此对于用户增长迅速的场景就不适用于User-CF模型。此外，余弦相似度和皮尔逊相似度的头部效应都很明显，即频繁给商品作出评价的用户会有大量用户与之相似，而对于没有评价习惯的用户来说，几乎没有其他用户与他相似。因此对于大多数用户都没有评价习惯的场景，User-CF也不适用。</p>
<a class="post-dummy-target" id="基于商品的协同过滤算法item-cf"></a><h3>基于商品的协同过滤算法（Item-CF）</h3>
<p>Item-CF的动机是找到目标用户曾经给予好评的商品，将与这些商品相似的商品推荐给目标用户。它将商品特征表示为所有用户对该商品的评分构成的向量，然后计算各个商品之间的相似度，得到商品相似度矩阵。之后找到与目标用户正反馈商品最相似的k个商品，预估目标用户对它们的接受程度，然后生成推荐列表将其推荐给用户。</p>
<a class="post-dummy-target" id="预估目标用户接受程度-1"></a><h4>预估目标用户接受程度</h4>
<p>目标用户正反馈商品集合以及与之最相似的k个商品后，我们需要对这k个商品计算推荐指数，表示预估的目标用户接受程度。推荐指数计算公式是对相似正反馈商品的加权平均，权重为商品相似度。
$$
R_{u, p} = \sum_{h \in H} ( w_{p, h} R_{u, h} )
$$
其中 $R_{u, p}$ 是预估目标用户 $u$ 对商品 $p$ 的接受程度，$H$ 为目标用户 $u$ 的正反馈商品集合，$w_{p, h}$ 是商品 $p$ 与正反馈商品 $h$ 之间的相似度，$R_{u, h}$ 是目标用户 $u$ 对正反馈商品 $h$ 的评分。这里省略了用于归一化的分母，因为只需要对用户尚未评分过的商品进行推荐。</p>
<a class="post-dummy-target" id="适用性-1"></a><h4>适用性</h4>
<p>Item-CF 根据物品相似度进行推荐，适用于兴趣变化较为稳定的应用场景。例如电商平台中用户往往倾向于寻找一类商品，视频网站、图书网站中用户对作品的兴趣点往往是比较稳定的，因此在这类场景中选择 Item-CF 作为推荐模型是一个合理的选择。</p>
<p>同时 Item-CF 仍然没有解决头部效应的问题。因此对于大多数用户都没有评价习惯的场景，Item-CF也不适用。</p>
<a class="post-dummy-target" id="矩阵分解算法mf"></a><h3>矩阵分解算法（MF）</h3>
<p>MF 期望能为每个用户和商品生成一个隐向量，将用户隐向量和商品隐向量定位到隐向量空间中，距离相近的用户表明其兴趣相近，与目标用户相近的商品表明目标用户青睐该商品的几率较大，就应该将其推荐给目标用户。MF 假设用户隐向量和视频隐向量是通过分解共现矩阵生成的（共现矩阵是指所有用户对商品的评分记录构成的矩阵），即认为用户 $u$ 对商品 $i$ 的评分是由用户 $u$ 的隐向量 $p_u$ 和商品 $i$ 的隐向量 $q_i$ 的点积得到的，即 $r_{u, i} = p_u \cdot q_i$。MF 先随机初始化所有用户和商品的隐向量，然后通过梯度下降算法不断迭代得到所有用户和商品的逼近真实的隐向量值。</p>
<p>若选择L2损失函数，MF 的目标为
$$
p^{\star}, q^{\star} = \arg \min_{p, q} \sum_{(u, i) \in K} ( r_{u, i} - q_i^T p_u )^2
$$
为了减少过拟合现象，可以加入正则化项。若加入 L2 正则项，MF 的，目标为
$$
p^{\star}, q^{\star} = \arg \min_{p, q} \sum_{(u, i) \in K} ( r_{u, i} - q_i^T p_u )^2 + \lambda ( ||q_i||^2 + ||p_u||^2 )
$$
此外，为了修正用户评分偏置和物品评分偏置，可以在矩阵分解时加入偏差向量
$$
r_{u, i} = p_u \cdot q_i + \mu + b_i + b_u
$$
其中，$\mu$ 表示全局偏差常数，使用所有评分的均值；$b_i$ 表示物品偏差系数，使用物品 $i$ 所有评分的均值；$b_u$ 表示用户偏差系数，使用用户 $u$ 历史给出的评分的均值。那么目标应改写为
$$
p^{\star}, q^{\star} = \arg \min_{p, q} \sum_{(u, i) \in K} ( r_{u, i} - q_i^T p_u - \mu - b_i - b_u )^2 + \lambda ( ||q_i||^2 + ||p_u||^2 )
$$
通过梯度下降算法不断迭代，就能得到用户隐向量 $p$ 和商品隐向量 $q$，从而补全共现矩阵，获得每个用户对每个商品的预计接受程度，用于生成定制化的商品推荐列表。</p>
<a class="post-dummy-target" id="因子分解机算法fm"></a><h3>因子分解机算法（FM）</h3>
<p>（待完成）</p>
<p>辛普森悖论：将任务分组后进行测试，在每一组都表现更优的对象，在不分组测试的情况下可能反而是处于劣势。例如点击率预估问题，有 A 和 B 两种视频，我们根据男性用户特征使用逻辑回归模型预测出 A 的点击率更高，根据女性用户特征仍然是A的点击率更高。但如果不考虑性别因素，使用全体用户特征预测点击率，可能会出现B的点击率反而更高的情况。而进行分组以后才能够更定制计划地向用户推荐商品，这就说明特征交叉是有必要的。</p>
<p>FM 如何解决数据稀疏性问题：只要组合特征 $&lt;i, j&gt;$ 中出现了 $a$（即 $i=a$ 或 $j=a$），那么 FM 模型就会更新参数 $w_a$，这样模型大大降低了对数据稀疏性的要求，甚至对于一个从未出现过的特征组合，FM 也具备计算推断的能力。</p>
<a class="post-dummy-target" id="特征域因子分解机算法ffm"></a><h3>特征域因子分解机算法（FFM）</h3>
<p>（待完成）</p>
<p>FFM 模型中交叉特征 $&lt;i, j&gt;$ 的权重参数 $w_{i,j}$ 仍然是两个 $k$ 维隐向量的乘积，但对于 $i$ 的表征不再是单独一个隐向量，而是 $n-1$ 个隐向量。当特征 $i$ 与特征 $j$ 交叉时，使用 $i$ 的第 $j$ 个隐向量与 $j$ 的第 $i$ 个隐向量进行点积，从而得到组合特征的权重参数 $w_{i,j}$。</p>
<a class="post-dummy-target" id="深度学习推荐系统"></a><h2>深度学习推荐系统</h2>
<p>（待完成）</p>
<a class="post-dummy-target" id="参考文献"></a><h2>参考文献</h2>
<p>[1] Davide Goldberg &amp; Davide Nichols &amp; Brian M. Oki &amp; Douglas Terry.  <em>Using Collaborative Filtering to Weave an Information Tapestry.</em> Communication of the ACM 35.12 (1992):61-71.</p>
<p>[2] Greg Linden &amp; Brent Smith &amp; Jeremy York. <em>Amazon.com Recommendations: Item-to-Item Collaborative Filtering.</em> IEEE Internet computing 1(2003):76-80.</p>
<p>[3] Yehuda Koren &amp; Robert Bell &amp; Chris Volinsky. <em>Matrix Factorization Techniques for Recommender Systems.</em> Computer 8 (2009): 30-37.</p>
<p>[4] Steffen Rendle. <em>Factorization Machines.</em> 2010 IEEE International Conference on Data Mining. IEEE, 2010.</p>
<p>[5] Yuchin Juan &amp; Yong Zhuang &amp; Wei-Sheng Chin. <em>Field-aware Factorization Machines for CTR Prediction.</em> Proceedings of the 10th ACM Comference on Recommender Systems. ACM, 2016.</p>
<p>[6] Alex Krizhevsky &amp; Ilya Sutskever &amp; Geoffrey E. Hinton. <em>ImageNet Classification with Deep Convolutional Neural Networks.</em> Advances in neural information processing systems. 2012.</p></div><div class="post-footer" id="post-footer">
    <div class="post-info">
        <div class="post-info-line">
            <div class="post-info-mod">
                <span>本文于 2020-12-04 更新</span>
            </div>
            <div class="post-info-license"></div>
        </div>
        <div class="post-info-line">
            <div class="post-info-md"></div>
            <div class="post-info-share"><span><a href="//www.linkedin.com/shareArticle?url=https%3a%2f%2fdiraclee.gitee.io%2f2020%2f12%2f%25E6%258E%25A8%25E8%258D%2590%25E7%25B3%25BB%25E7%25BB%259F%25E7%25BB%25BC%25E8%25BF%25B0%2f&amp;title=%e6%8e%a8%e8%8d%90%e7%b3%bb%e7%bb%9f%e7%bb%bc%e8%bf%b0" target="_blank" title="分享到 LinkedIn">
            <i class="fab fa-linkedin fa-fw"></i>
        </a><a href="//service.weibo.com/share/share.php?url=https%3a%2f%2fdiraclee.gitee.io%2f2020%2f12%2f%25E6%258E%25A8%25E8%258D%2590%25E7%25B3%25BB%25E7%25BB%259F%25E7%25BB%25BC%25E8%25BF%25B0%2f&amp;appkey=&amp;title=%e6%8e%a8%e8%8d%90%e7%b3%bb%e7%bb%9f%e7%bb%bc%e8%bf%b0" target="_blank" title="分享到 Weibo">
            <i class="fab fa-weibo fa-fw"></i>
        </a></span></div>
        </div>
    </div>

    <div class="post-info-more">
        <section><span class="tag">
                        <a href="https://diraclee.gitee.io/tags/%E6%8E%A8%E8%8D%90%E7%B3%BB%E7%BB%9F/"><i class="fas fa-tag fa-fw"></i>&nbsp;推荐系统</a>&nbsp;
                    </span><span class="tag">
                        <a href="https://diraclee.gitee.io/tags/%E7%BB%BC%E8%BF%B0/"><i class="fas fa-tag fa-fw"></i>&nbsp;综述</a>&nbsp;
                    </span></section>
        <section>
            <span><a href="javascript:window.history.back();">返回</a></span>&nbsp;|&nbsp;<span><a href="https://diraclee.gitee.io">主页</a></span>
        </section>
    </div>

    <div class="post-nav"><a href="https://diraclee.gitee.io/2020/11/svm/" class="prev" rel="prev" title="SVM 公式推导"><i class="fas fa-angle-left fa-fw"></i>SVM 公式推导</a>
            <a href="https://diraclee.gitee.io/2020/12/%E7%8E%B0%E4%BB%A3%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9B%BE%E5%BD%A2%E5%AD%A6%E5%85%A5%E9%97%A8/" class="next" rel="next" title="现代计算机图形学入门">现代计算机图形学入门<i class="fas fa-angle-right fa-fw"></i></a></div>
</div><div class="post-comment"></div>
    </article></div>
            </main><footer class="footer">
    <div class="copyright"><div class="copyright-line">由 <a href="https://gohugo.io/" target="_blank" rel="external nofollow noopener noreffer">Hugo</a> 强力驱动 | 主题 - <a href="https://github.com/dillonzq/LoveIt" target="_blank" rel="external nofollow noopener noreffer">LoveIt<i class="far fa-heart fa-fw"></i></a>
        </div>

        <div class="copyright-line"><i class="far fa-copyright fa-fw"></i><span itemprop="copyrightYear">2020</span><span class="author" itemprop="copyrightHolder">&nbsp;<a href="https://diraclee.gitee.io" target="_blank">Dirac Lee</a></span>&nbsp;|&nbsp;<span class="license"><a rel="license external nofollow noopener noreffer" href="https://creativecommons.org/licenses/by-nc/4.0/" target="_blank">CC BY-NC 4.0</a></span></div>
    </div>
</footer></div><a href="#" class="dynamic-to-top" id="dynamic-to-top" data-scroll>
            <span>&nbsp;</span>
        </a><script src="/js/lib/jquery/jquery.slim.min.js"></script><script src="/js/lib/lazysizes/lazysizes.min.js"></script><script src="/js/lib/smooth-scroll/smooth-scroll.polyfills.min.js"></script><script>window.scroll = new SmoothScroll('[data-scroll]', {speed: 300, speedAsDuration: true});</script><link rel="stylesheet" href="/css/lib/katex/katex.min.css"><script src="/js/lib/katex/katex.min.js"></script><script defer src="/js/lib/katex/auto-render.min.js"></script><link rel="stylesheet" href="/css/lib/katex/copy-tex.min.css"><script defer src="/js/lib/katex/copy-tex.min.js"></script><script defer src="/js/lib/katex/mhchem.min.js"></script><script>
        document.addEventListener("DOMContentLoaded", function () {
            renderMathInElement(document.body, {
                delimiters: [
                    { left: "$$", right: "$$", display: true },
                    { left: "\\(", right: "\\)", display: false },
                    { left: "\\[", right: "\\]", display: true },{ left: "$", right: "$", display: false },]
            });
        });
    </script><script src="/js/blog.min.js"></script></body>
</html>